package com.itheima.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 张义
 * @describe:
 * @date 2021/06/19
 */

public class ProxyTest {

    public static void main(String[] args){
        // 创建对象
        final Target target = new Target();

        // 增强对象
        final Advice advice = new Advice();

        // 返回值就是动态生成的代理对象 , 需要用接口来接
        TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(
            target.getClass().getClassLoader(), // 目标对象类加载器
            target.getClass().getInterfaces(), // 目标对象相同的接口字节码对象数组
            new InvocationHandler() {
                // 调用代理对象的任何方法， 实质执行的都是 invoke 方法
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    advice.before();// 前置增强
                    Object invoke = method.invoke(target , args); // 执行目标方法
                    advice.afterReturning(); // 后置增强
                    return invoke;
                }
            }
        );

        // 调用代理对象方法
        proxy.save();

    }

}
